{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from extract import system_prompt\n",
    "from schema import novel_schema\n",
    "from LLM import DeepseekChat\n",
    "from utils import ReadFiles\n",
    "from tqdm import tqdm\n",
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "29"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "file_path = './data/test.txt'\n",
    "\n",
    "docs = ReadFiles(file_path).get_content(max_token_len=500, cover_content=0)\n",
    "len(docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Your goal is to extract structured information from the user's input that matches the form described below. When extracting information please make sure it matches the type information exactly. Do not add any attributes that do not appear in the schema shown below.\n",
      "\n",
      "```TypeScript\n",
      "    script: Array<Dict( // Adapted from the novel into script\n",
      "    role: String // The character who is speaking ,\n",
      "    dialogue: String // The dialogue spoken by the characters in the sentence \n",
      "    )>\n",
      "```\n",
      "\n",
      "Please output the extracted information in JSON format in Excel dialect. \n",
      "\n",
      "Do NOT add any clarifying information. Output MUST follow the schema above. Do NOT add any additional columns that do not appear in the schema.\n",
      "\n",
      "Input: \n",
      "\n",
      "            他下意识放轻了脚步，不制造出明显的噪音。\n",
      "            刚登上二楼，他看见盥洗室的门突然打开，穿着旧布长裙的梅丽莎一副睡眼惺忪的模样出来。\n",
      "            “你回来了……”梅丽莎还有些迷糊地揉了揉眼睛。\n",
      "            克莱恩掩住嘴巴，打了个哈欠道：\n",
      "            “是的，我需要一个美好的梦境，午餐之前都不要叫醒我。”\n",
      "            梅丽莎“嗯”了一声，忽然想起什么似地说道：\n",
      "            “我和班森上午要去圣赛琳娜教堂做祈祷，参与弥撒，午餐可能会迟一点。”\n",
      "            \n",
      "Output:\n",
      "[\n",
      "    {\n",
      "        \"role\": \"梅丽莎\",\n",
      "        \"dialogue\": \"你回来了……\"\n",
      "    },\n",
      "    {\n",
      "        \"role\": \"克莱恩\",\n",
      "        \"dialogue\": \"是的，我需要一个美好的梦境，午餐之前都不要叫醒我。\"\n",
      "    },\n",
      "    {\n",
      "        \"role\": \"梅丽莎\",\n",
      "        \"dialogue\": \"我和班森上午要去圣赛琳娜教堂做祈祷，参与弥撒，午餐可能会迟一点。\"\n",
      "    }\n",
      "]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sys_prompt = system_prompt(novel_schema)\n",
    "print(sys_prompt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'第一百一十二章马术教练的问题（求月票）\\n\\n回到客厅，克莱恩拿起裁信刀，随手拆开封口，取出了艾辛格.斯坦顿寄来的信。\\n\\n那位知名大侦探在信上写到：\\n\\n“你的想法给了我们极大的帮助，请允许我先在这里做出感谢。”\\n\\n“收到你寄来的信后，我们立刻就组织人手排查了一些重点区域，果然发现了相应的线索，不少经常出没于附近且被居民们记住的流浪动物，陆续都不见了。”\\n\\n“在这个过程里，我们还注意到一件有趣的事情，四年前那起连环杀人案中，对，目标是单身且有一个孩子的妓女那起，不少住在案发现场周围的人曾经提到过，最有嫌疑的那个少年虽然孤僻，阴狠，但他对动物却相当有爱心，尤其是一条体型较大的黑狗。”\\n\\n“那个少年死于黑帮火并后，周围的人们再也没见过那条狗。”\\n\\n“我很好奇，它现在的主人是谁，是更久之前，某起未破的连环杀人案的凶手吗？”\\n\\n“以上的事情都在第12起凶手案现场得到了一定的证明，并发挥了关键的作用，让警方初步锁定了嫌疑者，如果一切顺利，案犯被逮捕之后，我们就能够获得绝大部分赏金。”\\n“我的朋友，我清楚地记得你的贡献，不会忘记你的那一份。”\\n\\n……\\n\\n艾辛格.斯坦顿似乎有点怀疑我知道了“恶魔”的真相，所以故意暗示了一些事情？克莱恩放下信纸，无声嘀咕道。\\n\\n不过，这封信也让他真正放下了心：\\n\\n官方非凡者们没有找错对象！\\n\\n那条恶魔巨犬如果没有得到另外的帮助，被抓获被击毙是迟早的事情。\\n\\n至于艾辛格.斯坦顿猜测对方还有位主人的事情，克莱恩缺乏足够的证据确认，只能说有一定的概率。\\n\\n“总之，我的任务到此为止，接下来就是值夜者、代罚者、机械之心小队的事情。”克莱恩抽出崭新的纸张，拿起圆腹钢笔，给艾辛格.斯坦顿回了封充满谦虚意味的信，并对他那些微妙的暗示置之不理，就像一位真正的普通私家侦探一样。\\n\\n又剪了个纸人，出门寄好信后，克莱恩踱步来到公共马车等待点，一身轻松地想道：\\n“接下来就可以等着收钱了……”\\n\\n“雷帕德说自己要连看三天罗塞尔纪念展，我得等周六再去找他，支付最后一笔款项，希望到时候自行车的专利已经申请下来了，哎，贝克兰德专利局的工作效率似乎一直都不高。”\\n\\n克莱恩刚才已经想好了今天的安排，在非凡者聚会没法召开，买不到相应物品的情况下，他突然空闲了下来，短暂竟不需要再忙碌。\\n\\n“上午去克拉格俱乐部，练枪，练非凡能力，并在那里用午餐，接着找家较好的马戏团，观摩下魔术师的表演，看能不能得到点灵感。”他掏出金壳怀表看了一眼，心情不错地登上了公共马车。\\n\\n…………\\n\\n希尔斯顿区，克拉格俱乐部。\\n\\n因为克莱恩每周至少过来两次，所以侍者们全都记住了他，不需要他再出示会员证明和白霜星座徽章。\\n\\n此时是周三上午，克拉格俱乐部的成员则大部分属于较有地位的中产阶级，从事着固定的颇为体面的工作，不是周日，不是年假，不是下午茶时间，很难过来。\\n宽敞明亮的大厅显得异常空荡，只有角落的茶几沙发区域坐着那么几个人。\\n\\n一眼扫过那里，克莱恩看见了位熟人，于是上去打了声招呼：\\n\\n“塔利姆，今天的天气是那样的棒，你应该在赛马场的。”\\n\\n那位熟人正是在玛丽太太拜托下介绍他加入俱乐部的贵族马术教师塔利姆.杜蒙特，他曾经还给克莱恩带来过一桩生意，那就是保护《每日观察报》的记者迈克.约瑟夫到“金玫瑰”做调查。\\n\\n塔利姆抬起脑袋，摸了下自己的棕色短卷发，露出笑容道：\\n\\n“噢，尊敬的大侦探，你最近在忙碌什么？我很久没看见你了。”\\n\\n那是你好几天没来俱乐部了……克莱恩笑着坐到了塔利姆旁边的沙发上：\\n\\n“在帮警察们调查那起连环杀人案，虽然不一定能有收获，但赏金足够诱人，而且，和警察部门建立良好的关系对我们私家侦探来说非常重要。”\\n以上都是在吹牛，我只是一个被召集的不起眼角色……他在心里自我调侃了一句。\\n\\n坐在他们后面那个沙发区域的几位会员则在一位疑似股票经纪人的男士引导下，讨论着最新的西部铁路股票和东拜朗种植园股票。\\n\\n对克莱恩的回答，塔利姆没有任何怀疑，呵呵笑道：\\n\\n“这果然是大侦探忙碌的事情。”\\n\\n寒暄了几句后，他逐渐进入了一种若有所思的状态。\\n\\n就在克莱恩打算告辞去地下靶场时，塔利姆突然望向他道：\\n\\n“莫里亚蒂先生，我能请教一个问题吗？”\\n\\n“嗯，你可以收咨询费。”\\n\\n“这单免费，还有，叫我夏洛克就行了。”克莱恩哈哈一笑道。\\n\\n塔利姆轻轻点了下头，犹豫着说道：\\n\\n“我有个朋友，爱上了不该爱的人，这种情况该怎么处理？”\\n\\n虽然我一直认为，询问类似的问题时，“我有个朋友”就等于“我自己”，但塔利姆的情绪颜色说明不是他本人，他很为难，但却看不见丝毫的痛苦……开启了灵视的克莱恩往后微靠，双手交握道：\\n“很抱歉，我不是心理医生，也不是报纸杂志上那些擅于解决情感问题的专家。”\\n\\n“我唯一的建议是，不要犯法。”\\n\\n“呵呵，这是开玩笑的，首先，我们要弄清楚‘不该’是源于什么？双方的家庭之间有仇恨关系？”\\n\\n塔利姆看了他一眼，无奈道：\\n\\n“不，这不是《罗密欧与朱丽叶》的故事！”\\n\\n听到对方的回答，克莱恩的耳畔似乎响起了一阵虚幻的低语：\\n\\n作者：罗塞尔.古斯塔夫……作者：罗塞尔.古斯塔夫……作者：罗塞尔.古斯塔夫……\\n\\n他摇了下脑袋，对莎老爷子说了声抱歉，微笑道：\\n\\n“罗塞尔大帝这部作品实在太经典了，一提到不该的爱情，我就会想到它。”\\n\\n“那么，究竟是为什么不该在一起呢？”\\n\\n塔利姆默然几秒道：\\n\\n“我得保密，抱歉，就当我没有问过。”\\n保密？那是位很有身份的人啊……爱上了同性？爱上了有血缘关系的人？克莱恩忍住强烈的好奇，摊手道：\\n\\n“那我只能再给一个建议，多看看《暴风山庄》《爱情与嫉妒》这些感情充沛的畅销。”\\n\\n塔利姆翕动了几下嘴唇，叹息一声道：\\n\\n“哎，这只能是最后的办法，在我看来，那些畅销里的感情简直不像是发生在正常人类之间。”\\n\\n“我也这么觉得！”克莱恩深有同感地附和。\\n\\n和塔利姆相视一笑后，他起身前往地下靶场练枪练非凡能力，快到中午的时候，才返回一楼，直奔自助餐厅。\\n\\n他之前已经注意到，今天的限量供应是，红酒煎鹅肝，并搭配有苹果片和浸入了黄油的面包。\\n\\n取好食物，克莱恩端着餐盘，走向塔利姆在的那张桌子，而此时此刻，那里除了塔利姆，还有另外一位他的熟人，同样作为担保，介绍他进入俱乐部的外科医生艾伦.克瑞斯。\\n\\n刚放好餐盘，还未来得及坐下，克莱恩突然发现那位知名外科医生的椅子旁边靠了根拐杖。\\n“艾伦，怎么了？”他关心地问了一句。\\n\\n个子高瘦，长相冷淡，戴着副金丝边眼镜的艾伦轻拍了下右腿道：\\n\\n“不，不要提，这真是太倒霉了！我从楼梯上摔了下去，出现了较为严重的骨裂，只能打石膏做固定。”\\n\\n“真是不够走运啊。”克莱恩附和着叹息了一声，并切了块鹅肝，蘸汁塞入口中，那刚一接触就会融化般的感觉让脂肪的芳香不断外扩，刺激着每一个味蕾。\\n\\n“我已经不走运很长一段时间了。”艾伦举手推了下镜框，顺势揉了揉额角。\\n\\n他随即望向克莱恩，又看了看塔利姆，犹豫着问道：\\n\\n“莫里亚蒂先生，你有没有，有没有……”\\n\\n“什么？”克莱恩抬头问道。\\n\\n艾伦压低嗓音道：\\n\\n“你是一位知名的大侦探，应该有认识不少人吧？”\\n\\n“还好。”克莱恩不明白对方什么意思地敷衍了一句。\\n艾伦又看了塔利姆一眼，吸了口气道：\\n\\n“你有认识类似乡村巫医的人吗？不，我的意思，有些本事的占卜者或神秘学爱好者，我想，我觉得，我最近的不走运太不正常了……”\\n\\n“我知道那些很大可能是假的，骗人的，但已经找不到别的办法摆脱倒霉，我试过去教堂祈求，捐赠，参加弥撒，但没有任何作用。”\\n\\n有些本事的占卜者或神秘学爱好者……你仿佛是在说我……克莱恩思索道：\\n\\n“艾伦，你详细说一下，你都遭遇了什么事情。”\\n\\n旁边的塔利姆也跟着点头：\\n\\n“不用担心，我虽然是主的信徒，但并不排斥神秘学的东西。”\\n\\n艾伦苦恼地叹气道：\\n\\n“很多很多事情，比如，做手术出现失误，旅行遭遇蒸汽列车事故，回家又发现进了小偷，去医院，结果跌下了楼梯……你说，会不会是有谁在诅咒我？”\\n\\n嗯，之前听艾伦提过类似的事情……克莱恩微微皱起了眉头。\\n\\n作为一名前值夜者，他很容易就从这样的描述联想到一件封印物：\\n厄运布偶！\\n\\n类似的物品？他开启灵视，严肃问道：\\n\\n“艾伦，你仔细回想一下，在那些不走运的事情连续到来前，你或者你的家人，嗯，你的家人也有遭遇不走运的事情吗？”\\n\\nPS：求月票！不要去管月底有没有双倍，月初保持好的排名比月底爬上去重要多了\\n\\n天才一秒记住本站地址：.。手机版阅读网址：m.\\n\\n第一百零五章扑朔迷离\\n\\n难道那个恶灵就是“红天使”梅迪奇，曾经侍奉那位“造物主”的天使之王，“救赎蔷薇”的创立者之一？克莱恩瞬间产生了这么个联想，并倒推回去，寻找痕迹和线索：\\n\\n“‘红祭司’牌的前任持有者，因为某种程度的吸引，来到那座地下宫殿内，死在了图铎后裔们的身旁；\\n\\n“我梦中看见的那个恶灵，生前可以轻松斩杀强大的巨龙；\\n\\n“它知道‘异种’途径序列4‘木偶’的魔药配方，甚至更多；\\n\\n“它很清楚‘救赎蔷薇’的事情；\\n\\n“从大灾变后就存在于这个世界上的正神教会都不知道以前的宾西现在的班西居住着梅迪奇家族的后裔，而那个恶灵却能给予相应的提示。”\\n它是“红天使”梅迪奇死后衍化而成的可能很大……而一位天使之王竟然会被“血皇帝”亚利斯塔.图铎杀掉，这是否说明后者已经超越了序列1，达到了序列0真神位阶，已不可直视……\\n\\n那个恶灵自己说过，第四纪后期，所罗门帝国的“黑皇帝”、图铎帝国的“血皇帝”、特伦索斯特帝国的“夜皇”是在为序列0的位置争斗，直到亚利斯塔.图铎疯掉……这是否意味着，从那个时候开始，“血皇帝”就是一位半疯的真神了？\\n\\n对了，阿兹克先生也在信里提到，他被“血皇帝”亚利斯塔.图铎扫了一眼，就失去了知觉，那个时候的他，至少已经是序列4的半神，“血皇帝”如此威势，只有位列真神层次才可以解释……\\n\\n阿兹克先生在那封信中还描述了复活归来的真正“黑皇帝”，称祂坐在巨大的王座上，俯视着整个大地……“黑皇帝”能复活归来，大概率是序列0位阶的真神……如果真是这样，“四皇之战”比我之前认为的高端很多啊，不再只是三位序列1争夺序列0的位置……克莱恩将前后许多事情联系起来，对第四纪的历史有了全新的认识。\\n可这样一来，许多疑问随之涌现：\\n\\n“如果那个古老的恶灵真是‘天使之王’梅迪奇，那座地下宫殿就很可能属于‘血皇帝’亚利斯塔.图铎，那么，为什么会有两张并排的宝座，为什么会有六位正神的人形雕像？\\n\\n“半疯的‘血皇帝’为什么要杀掉‘红天使’梅迪奇？祂成为序列0后，又占据的是哪个位置？首先，可以排除‘黑皇帝’……不会是‘红祭司’吧？杀天使之王梅迪奇就是为了对方的非凡特性？\\n\\n“可‘红祭司’和‘黑皇帝’不像是可以互相替换的相近途径，前者我几乎可以确定是和‘魔女’途径一对，嗯……队长说过，服食其他途径的魔药时，第一次并不会死，大概率是疯掉的，并获得扭曲的可怕的诡异的力量，这符合‘血皇帝’半疯的特质！\\n“祂在最后一步，因为‘黑皇帝’和相近途径的位置已经没有希望，做了最疯狂的选择，以半疯为代价，转到了完全没关系的其他途径？\\n\\n“但这同样有问题，晋升‘红祭司’需要杀死天使之王梅迪奇，可未晋升前，亚利斯塔.图铎仅靠自己又完成不了这件事情，除非，除非，有更多的序列1帮助祂，或者序列0的真神……”\\n\\n想到这里，克莱恩脑海内忽然闪过了地下宫殿里那一尊尊雕像：\\n\\n以月为枕的黑夜女神雕像、怀抱婴儿的大地母神雕像、背披闪电的风暴之主雕像、英俊朝气的永恒烈阳雕像、高踞王座的战神雕像、戴着兜帽的知识与智慧之神雕像，同时从黑暗的房间内投来了冰冷的目光。\\n这一刻，克莱恩竟有些不寒而栗。\\n\\n但是，他清楚地记得，六神支持的是特伦索斯特帝国，而非图铎王朝。\\n\\n第四纪的历史越了解越迷惑越惊悚啊……克莱恩暗叹了一声。\\n\\n“你在想什么？”阿兹克.艾格斯注意到了他的停顿。\\n\\n克莱恩随口扯到：\\n\\n“我只是在想，既然‘红天使’梅迪奇早在第四纪就陨落于‘血皇帝’亚利斯塔.图铎之手，那么过去几百年里，班西港信仰的‘天气之神’又是谁？\\n\\n“他们表现出来的异常又是源于什么……”\\n\\n说到这里，克莱恩戛然而止，因为班西港的事情和他想象得不一样。\\n\\n他原以为那里沉睡着“红天使”梅迪奇，结果没想到对方早就陨落。\\n\\n既然如此，青柠檬餐厅和电报局内隐藏的秘密就更加让人难以猜测，更无从推断来源，越是细想越是让人恐惧。\\n“那个恶灵提示‘宾西镇’，会不会已经预料到这样的结果，这本身就是祂摆脱封印的步骤？要不要把这件事情告诉阿兹克先生，看他有什么意见？\\n\\n“嗯，先让身在贝克兰德的‘魔术师’小姐注意那片区域，看有没有异常，如果没有，就等我重返贝克兰德，联络上莎伦小姐，征求过她的意见后，再告知阿兹克先生，毕竟是我们一起探索的遗迹，得尊重她的想法。要是有异常，那就只能事急从权了……”克莱恩迅速有了决断。\\n\\n阿兹克听到他的疑问，哈哈一笑道：\\n\\n“不要再去想这些事情，它们肯定已经被风暴教会埋葬，强行去探求原因，反而会带来极大的危险，即使达到天使位阶，也有因此陨落的可能。”\\n\\n在神秘学世界里，好奇往往是导致死亡的主要因素……克莱恩想到了经历过和听闻过的一件件事情。\\n\\n他转而说道：\\n\\n“阿兹克先生，我已经拥有属于自己的信使了。”\\n“比我想象得快。”阿兹克微笑说道。\\n\\n克莱恩随即简单地讲了讲自己怎么修改咒文，怎么完成召唤，怎么遇上奇葩灵界生物的。\\n\\n“召唤灵界生物的时候，不是对应的职业，确实会出现类似的事情，需要反复尝试，才有可能得到想要的结果，但反复尝试的过程中，又容易遇到危险，即使你加上了‘友善’等描述，也不是绝对的安全，召唤出来的灵界生物对你没有恶意，不想伤害你，不代表它本身的存在不会危害你，也许只是它自带的气息，就能让你腐烂成血水。”阿兹克听完“急速者”、“弱存在感者”和“耐击打者”事例后，笑着提醒了几句，末了问道，“最后怎么成功的？”\\n\\n克莱恩不太好意思地说道：\\n\\n“我把最后一句改成了‘愿意成为我信使的独特存在’。”\\n\\n阿兹克愣了一秒，古怪地看了克莱恩一眼：\\n\\n“……这描述太宽泛了，正常不会成功的。”\\n\\n“也许我当时极为幸运……”克莱恩谨慎地将自己信使的样子描述了一遍，甚至未隐瞒对方索求金币的事情。\\n阿兹克仔细回想了一阵道：\\n\\n“我对这位灵界生物没有印象，但既然已经签订了契约，由冥界见证，她应该就不会危害到你，不过，在你彻底了解她之前，除了送信，尽量不要驱使她。”\\n\\n“……好。”克莱恩本想说除了送信，也没什么事情可以驱使她，结果一下想起了和A先生战斗时的场景。\\n\\n房间内短暂静默，克莱恩将话题导回了正轨：\\n\\n“阿兹克先生，我们什么时候出发去黑死号？”\\n\\n拖延的时间越久，他在黑死号上留下的痕迹就越可能在日常清扫里被除去。\\n\\n“现在。”阿兹克站了起来，戴上了礼帽。\\n\\n克莱恩穿戴整齐，正想找借口去盥洗室占卜下今晚行动是否危险，却被阿兹克抓住肩膀，直接带入了灵界。\\n\\n层叠的色块和近乎无形的一道道身影里，他听见阿兹克先生说道：\\n\\n“开始吧。”\\n\\n这么直接？不需要确认下情况？也许大佬已经用自己的办法权衡过危险程度了……克莱恩无声咕哝了两句，拿起手杖，占卜自己遗留物品的下落。\\n手杖自行飞了起来，向着前方翻滚跳跃。\\n\\n阿兹克带着克莱恩紧随其后，轻松穿行。\\n\\n没用多久，黑色的硬木手杖停顿了下来，前方是浓郁的黑色与重叠的阴影。\\n\\n通过这抽象的画面，克莱恩隐约辨认出它也许象征着黑死号。\\n\\n就在这个时候，阿兹克的身影却停顿了下来，语气略有些凝重地说道：\\n\\n“这里的灵告诉我，有危险。”\\n\\n有危险？能让阿兹克先生都感觉危险？“疾病中将”找来了帮手？魔女教派的高层？克莱恩霍然皱起眉头。\\n\\n——他充分相信大佬的判断，因为“死神”途径的序列7叫做“通灵者”，提升到半神层次后，有如此表现非常正常。\\n\\n阿兹克半闭眼眸两秒，旋即睁开道：\\n\\n“但问题不大，我们进去吧。”\\n\\n问题不大……对您而言，大概是这样……克莱恩嘴角微抽，决定改变下容貌。\\n如此一来，即使打不过，狼狈逃跑，也不会被人找上门！\\n\\n瞬息间，克莱恩拥有了独具特色的宽下巴和墨绿色的冰冷眼眸，脑后是棕色的古代武士发髻。\\n\\n他伪装成了“蠕动的饥饿”的前主人，“飓风中将”齐林格斯！\\n\\n阿兹克扫了他一眼，四周的场景突然有了急坠的感觉，各种鲜明的颜色飞快淡去。\\n\\n只是眨眼的工夫，克莱恩发现自己又回到了“疾病少女”特雷茜的船长室。\\n\\n这位英气明艳的女海盗穿着另一件白色衬衣，左肩位置有明显的包扎痕迹，黑发一圈圈盘起，不再妩媚垂下。\\n\\n面对突然出现的“来访者”，她并没有惊慌，甚至露出了笑容。\\n\\n这时，一道柔美的女声难以分辨位置地响起，似左似右，似前似后：\\n\\n“是你？”\\n\\nPS：只有一张存稿，今晚就不提前更新了，还是正常时间，预求周一推荐票~\\n\\n请记住本书首发域名：。九天神皇手机版阅读网址：\\n第一百九十七章真实魂体（感谢白银盟灰白夜空）\\n\\n“命运！”\\n\\n拖长艰涩的古赫密斯语单词回荡之中，灵界掠夺者和克莱恩所在的位置突然黯淡了一下。\\n\\n这是那样的不明显，就像半空刚好有一朵云飘过，未做停留。\\n\\n可等到幻觉一样的阴影转瞬消逝，套着半透明白色长袍的“无形人”已然僵立在了原地，衣物表面难以遏制地凸显出虫豸蠕动般的痕迹，滞涩，缓慢，艰难。\\n\\n它的对面，克莱恩眼神彻底恢复了清明，三重冠冕阴影下的脸庞不见了肉芽。\\n\\n这看起来就像刚才不是灵界掠夺者在操纵克莱恩的“灵体之线”，并接近成功，而是克莱恩在操纵灵界掠夺者的“灵体之线”，且即将把对方转化为秘偶！\\n\\n“窃运者”符咒，对调命运！\\n\\n这用“时之虫”制作的高级符咒，可以窃取到目标后续的命运，并把自身较短时间内的未来嫁接给对方，以此完成互换。\\n\\n所以，克莱恩和灵界掠夺者一下对调了处境，一个由死转生，一个从胜利在望瞬间跌进绝地。\\n确认灵界掠夺者富有智慧，极难对付，不好狩猎后，克莱恩就在表演撤退，看似鲁莽实则故意地让自身一步步陷入灵界掠夺者的控制，引诱它出现，并随时准备着在关键时刻使用“窃运者”符咒！\\n\\n那样一来，灵界掠夺者对敌人有多狠，自身的处境就会有多么绝望！\\n\\n当然，如果“窃运者”符咒没有达到效果，或者灵界掠夺者主魂并未出现，依赖的是别的办法掌控局面，克莱恩也还有最后的手段自保，那就是直接结束掉召唤，返回灰雾之上，用两个秘偶和几件神奇物品的损失换取本身的无恙。\\n\\n顾不得去惊讶“窃运者”符咒竟如此神奇，“偷盗者”途径的天使竟如此恐怖，克莱恩趁命运的对调还未结束，毫不犹豫举高了手中的“海神权杖”。\\n\\n'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "docs[20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'role': '艾辛格.斯坦顿', 'dialogue': '你的想法给了我们极大的帮助，请允许我先在这里做出感谢。'}, {'role': '艾辛格.斯坦顿', 'dialogue': '收到你寄来的信后，我们立刻就组织人手排查了一些重点区域，果然发现了相应的线索，不少经常出没于附近且被居民们记住的流浪动物，陆续都不见了。'}, {'role': '艾辛格.斯坦顿', 'dialogue': '我很好奇，它现在的主人是谁，是更久之前，某起未破的连环杀人案的凶手吗？'}, {'role': '艾辛格.斯坦顿', 'dialogue': '以上的事情都在第12起凶手案现场得到了一定的证明，并发挥了关键的作用，让警方初步锁定了嫌疑者，如果一切顺利，案犯被逮捕之后，我们就能够获得绝大部分赏金。'}, {'role': '艾辛格.斯坦顿', 'dialogue': '我的朋友，我清楚地记得你的贡献，不会忘记你的那一份。'}, {'role': '克莱恩', 'dialogue': '总之，我的任务到此为止，接下来就是值夜者、代罚者、机械之心小队的事情。'}, {'role': '塔利姆', 'dialogue': '莫里亚蒂先生，我能请教一个问题吗？'}, {'role': '克莱恩', 'dialogue': '这单免费，还有，叫我夏洛克就行了。'}, {'role': '塔利姆', 'dialogue': '我有个朋友，爱上了不该爱的人，这种情况该怎么处理？'}, {'role': '克莱恩', 'dialogue': '我唯一的建议是，不要犯法。'}, {'role': '克莱恩', 'dialogue': '首先，我们要弄清楚‘不该’是源于什么？双方的家庭之间有仇恨关系？'}, {'role': '塔利姆', 'dialogue': '不，这不是《罗密欧与朱丽叶》的故事！'}, {'role': '克莱恩', 'dialogue': '那么，究竟是为什么不该在一起呢？'}, {'role': '塔利姆', 'dialogue': '我得保密，抱歉，就当我没有问过。'}, {'role': '克莱恩', 'dialogue': '那我只能再给一个建议，多看看《暴风山庄》《爱情与嫉妒》这些感情充沛的畅销。'}, {'role': '艾伦', 'dialogue': '莫里亚蒂先生，你有没有，有没有……'}, {'role': '克莱恩', 'dialogue': '什么？'}, {'role': '艾伦', 'dialogue': '你是一位知名的大侦探，应该有认识不少人吧？'}, {'role': '克莱恩', 'dialogue': '还好。'}, {'role': '艾伦', 'dialogue': '你有认识类似乡村巫医的人吗？不，我的意思，有些本事的占卜者或神秘学爱好者，我想，我觉得，我最近的不走运太不正常了……'}]\n"
     ]
    }
   ],
   "source": [
    "model = DeepseekChat()\n",
    "response = model.chat(sys_prompt, docs[20])\n",
    "response = json.loads(response)\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 55%|█████▌    | 16/29 [06:54<06:27, 29.78s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Expecting value: line 1 column 1 (char 0)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 86%|████████▌ | 25/29 [12:50<02:25, 36.33s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Expecting value: line 1 column 1 (char 0)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 29/29 [14:08<00:00, 29.25s/it]\n"
     ]
    }
   ],
   "source": [
    "file_name = file_path.split('/')[-1].split('.')[0]\n",
    "\n",
    "for i in tqdm(range(len(docs))):\n",
    "    response = model.chat(sys_prompt, docs[i])\n",
    "    try:\n",
    "        response = json.loads(response)\n",
    "        for item in response:\n",
    "            with open(f'{file_name}.jsonl', 'a', encoding='utf-8') as f:\n",
    "                json.dump(item, f, ensure_ascii=False)\n",
    "                f.write('\\n')\n",
    "    except Exception as e:\n",
    "        print(e)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "nlp",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
